package chwgigs;

public class EX05_OOP4 {
	
	public static void main(String[] args) {
		RetangleVO rv = new RetangleVO(35, 45, "silver");
		
		System.out.println("사각형의 넓이 : " + RetangleService2.getArea(rv.width, rv.height));
		System.out.println("사각형의 둘레 : " + RetangleService2.getPerimeter(rv.width, rv.height));
		System.out.println("사각형의 색상 : " + rv.color);
		System.out.println();
		
		//
		FanVO fv = new FanVO(10, "yellow", 3, true);
		
		System.out.println("선풍기 팬의 크기 : " + fv.radius);
		System.out.println("선풍기 색상 : " + fv.color);
		if (fv.on){
			System.out.println("선풍기 회전 속도 : " + fv.speed);}
		System.out.println("선풍기의 작동 여부 : " + FanService.showFanInfo(fv.on));
		System.out.println();
		
		//
		AccountVO av = new AccountVO(1122, 20000, 4.5f);
		System.out.println("계좌번호 : " + av.aid);
		System.out.println("통장잔액 : " + av.balance);
		System.out.println("월간 이자율 : " + AccountService.getMonthlyInterestRate(av.interestRate));
		System.out.println("통장 개설 날짜 : " + av.dateCreated);
		av.balance = AccountService.withDraw(av.balance, 2500);
		System.out.println("1차 통장 잔액 : " + av.balance);
		av.balance = AccountService.withDraw(av.balance, 3000);
		System.out.println("2차 통장 잔액 : " + av.balance);
//		System.out.println("1차 통장 잔액 : " + AccountService.withDraw(av.balance, 2500));
//		System.out.println("2차 통장 잔액 : " + AccountService.withDraw(av.balance, 3000));
		
		System.out.println();
		
		StockVO sv = new StockVO("경영기술", 1000000, 750000);
		
		System.out.println("회사명 : " + sv.sname);
		System.out.println("어제의 주식 종가 : " + sv.previousClosingPrice);
		System.out.println("종목의 현재가 : " + sv.currentPrice);
		System.out.println("주가 변동율 : " + StockService.getChangePercent(sv.previousClosingPrice, sv.currentPrice));
		//
	}					// main

}						// class

	public class RetangleVO {
		float width = 1.0f;
		float height = 1.0f;
		String color = "white";
		
		public RetangleVO() { }
		public RetangleVO(float width, float height, String color) {
			this.width = width;
			this.height = height;
			this.color = color;
		}
	}
	
	public class RetangleService23 {
		static float getArea(float width, float height) {
			return width * height;
		}
		
		static float getPerimeter(float width, float height) {
			return (2 * width) + (2 * height);
		}
	}
	
	class FanVO {
		final int SLOW = 1;
		final int MEDIUM = 2;
		final int FAST = 3;
		int speed = SLOW;
		boolean on = false;
		float radius = 5.0f;
		String color = "blue";
		
		public FanVO() { }
		public FanVO(int radius, String color, int speed, boolean on) {
			this.radius = radius;
			this.color = color;
			this.speed = speed;
			this.on = on;
		}
	}
	
	class FanService {
		 static String showFanInfo(boolean on) {
			if ( on ) {  return "동작중"; }
			else { return "꺼져있음"; }
		}
	}
	
	class AccountVO {
		int aid = 0;
		int balance = 0;
		float interestRate = 0;
		String dateCreated = null;
		
		public AccountVO() { }
		public AccountVO(int aid, int balance, float interestRate) {
			this.aid = aid;
			this.balance = balance;
			this.interestRate = interestRate;
		}
		
	}
	//<call by value>
	//메서드의 매개 변수 유형이 기본 자료형인 경우 
	//기본 자료형 변수를 메서드의 매개변수로 전달하면 
	//JVM은 메서드의 지역변수에 그 값을 복사해 줌
	//따라서 메서드의 지역변수 값을 변경하더라도 
	//전달해준 변수에는 영향을 미치지는 않음
	//즉, 참조형 변수에 저장된 값은 실제 값이 아니고 그 값을 가리키는 주소를
	//의미하기 때문임 
	//따라서 메서드에서 참조된 객체에 변경을 가하면 
	//그변화는 호출된 코드에도 반영된다.
	
	class AccountService {
		static float getMonthlyInterestRate(float interestRate) {
			return interestRate / 12;
		}
		
		static int withDraw(int balance, int draw) {
			return balance - draw;
		}
		
		static int deposit(int balance, int depo) {
			return balance + depo;
		}
	}
	
	class StockVO {
		String sname = null;
		int previousClosingPrice = 0;
		int currentPrice = 0;
		
		public StockVO() { }
		public StockVO(String sname, int previousClosingPrice, int currentPrice) {
			this.sname = sname;
			this.previousClosingPrice = previousClosingPrice;
			this.currentPrice = currentPrice;
		}
	}
	
	class StockService {
		static float getChangePercent(float previousClosingPrice, float currentPrice) {
			return (1 - (float)(previousClosingPrice / currentPrice)) * 100;
		}
	}
